home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / micq-0.4.0 / util_ui.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  7KB  |  299 lines

  1. #include "micq.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <stdarg.h>
  5. #include <assert.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <errno.h>
  9. #include <time.h>
  10. #include <sys/types.h>
  11. #include <sys/time.h>
  12. #include <sys/stat.h>
  13. #include <netinet/in.h>
  14. #include <arpa/inet.h>
  15. #include <fcntl.h>
  16. #ifdef __SASC
  17. #include "amiga-dt.h"
  18. #endif
  19. #ifdef _WIN32
  20.    #include <io.h>
  21.    #define S_IRUSR        _S_IREAD
  22.    #define S_IWUSR        _S_IWRITE
  23. #endif
  24. #ifdef UNIX
  25.    #include <unistd.h>
  26.    #include <termios.h>
  27. #endif
  28. #include "mreadline.h"
  29.  
  30. #ifdef UNIX
  31. char *strdup( const char * );
  32. int strcasecmp( const char *, const char * );
  33. int strncasecmp( const char *, const char *, size_t );
  34. #endif
  35.  
  36. static BOOL No_Prompt=FALSE;
  37.  
  38. #ifndef __SASC
  39. #define ADD_COLOR(a)      else if ( ! strncmp( str2, a , strlen( a ) ) ) \
  40.       {                                                                 \
  41.          if ( Color )                                                   \
  42.             printf( a );                                                \
  43.          str2 += strlen( a );                                           \
  44.       }
  45. #else
  46. #define ADD_COLOR(a)      else if ( ! strncmp( str2, a , strlen( a ) ) ) \
  47.       {                                                                 \
  48.          if ( Color )                                                   \
  49.             addstrtobuf( a, strlen( a ));                               \
  50.          str2 += strlen( a );                                           \
  51.       }
  52. #endif
  53.  
  54.  
  55.  
  56. /***************************************************************
  57. Turns keybord echo off for the password
  58. ****************************************************************/
  59. S_DWORD Echo_Off( void )
  60. {
  61. #ifdef UNIX
  62.     struct termios attr; /* used for getting and setting terminal
  63.                 attributes */
  64.  
  65.     /* Now turn off echo */
  66.     if (tcgetattr(STDIN_FILENO, &attr) != 0) return(-1);
  67.         /* Start by getting current attributes.  This call copies
  68.         all of the terminal paramters into attr */
  69.  
  70.     attr.c_lflag &= ~(ECHO);
  71.         /* Turn off echo flag.  NOTE: We are careful not to modify any
  72.         bits except ECHO */
  73.     if (tcsetattr(STDIN_FILENO,TCSAFLUSH,&attr) != 0) return(-2);
  74.         /* Wait for all of the data to be printed. */
  75.         /* Set all of the terminal parameters from the (slightly)
  76.            modified struct termios */
  77.         /* Discard any characters that have been typed but not yet read */
  78. #endif
  79.     return 0;
  80. }
  81.  
  82.  
  83. /***************************************************************
  84. Turns keybord echo back on after the password
  85. ****************************************************************/
  86. S_DWORD Echo_On( void )
  87. {
  88. #ifdef UNIX
  89.     struct termios attr; /* used for getting and setting terminal
  90.                 attributes */
  91.  
  92.     if (tcgetattr(STDIN_FILENO, &attr) != 0) return(-1);
  93.  
  94.     attr.c_lflag |= ECHO;
  95.     if(tcsetattr(STDIN_FILENO,TCSANOW,&attr) != 0) return(-1);
  96. #endif
  97.     return 0;
  98. }
  99.  
  100. /**************************************************************
  101. Same as fM_print but for FD_T's
  102. ***************************************************************/
  103. void M_fdprint( FD_T fd, char *str, ... )
  104. {
  105.    va_list args;
  106.    int k;
  107.    char buf[2048]; /* this should big enough */
  108.         
  109.    assert( buf != NULL );
  110.    assert( 2048 >= strlen( str ) );
  111.    
  112.    va_start( args, str );
  113.    vsprintf( buf, str, args );
  114.    k = write( fd, buf, strlen( buf ) );
  115.    if ( k != strlen( buf ) )
  116.    {
  117.       perror(str);
  118.       exit ( 10);
  119.    }
  120.    va_end( args );
  121. }
  122.  
  123. /************************************************************
  124. Prints the preformated sting to stdout.
  125. Plays sounds if appropriate.
  126. ************************************************************/
  127. static void M_prints( char *str )
  128. {
  129.    int i;
  130.    
  131.    for ( i=0; str[i] != 0; i++ )
  132.    {
  133.       if ( str[i] != '\a' )
  134. #ifdef __SASC
  135.          addchartobuf(str[i]);
  136. #else
  137.          printf( "%c", str[i] );
  138. #endif
  139.       else if ( SOUND_ON == Sound )
  140. #ifdef __SASC
  141.          addchartobuf('\a');
  142. #else
  143.          printf("\a");
  144. #endif
  145.       else if ( SOUND_CMD == Sound )
  146.      system ( Sound_Str );
  147.    }
  148. #ifdef __SASC
  149.   writeoutbufout();
  150. #endif
  151. }
  152.  
  153. /**************************************************************
  154. M_print with colors.
  155. ***************************************************************/
  156. void M_print( char *str, ... )
  157. {
  158.    va_list args;
  159.    char buf[2048];
  160.    char *str1, *str2;
  161.    
  162.    va_start( args, str );
  163. #ifndef CURSES_UI
  164.    vsprintf( buf, str, args );
  165.    str2 = buf;
  166.    while ( (void *) NULL != ( str1 = strchr( str2, '\x1b' ) ) )
  167.    {
  168.       str1[0] = 0;
  169.       M_prints( str2 );
  170.       str1[0] = 0x1B;
  171.       str2 = str1;
  172.       if ( FALSE ) {;}
  173.       ADD_COLOR( NOCOL )
  174.       ADD_COLOR( SERVCOL )
  175.       ADD_COLOR( MESSCOL )
  176.       ADD_COLOR( CONTACTCOL )
  177.       ADD_COLOR( CLIENTCOL )
  178.       else
  179.       {
  180.           str2++;
  181.       }
  182.    }
  183.    M_prints( str2 );
  184. #else
  185.    #error No curses support included yet.
  186.    #error You must add it yourself.
  187. #endif
  188.    va_end( args );
  189. }
  190.  
  191. /***********************************************************
  192. Reads a line of input from the file descriptor fd into buf
  193. an entire line is read but no more than len bytes are 
  194. actually stored
  195. ************************************************************/
  196. int M_fdnreadln( FD_T fd, char *buf, size_t len )
  197. {
  198.    int i,j;
  199.    char tmp;
  200.  
  201.    assert( buf != NULL );
  202.    assert( len > 0 );
  203.    tmp = 0;
  204.    len--;
  205.    for ( i=-1; ( tmp != '\n' )  ; )
  206.    {
  207.       if  ( ( i < len ) || ( i == -1 ) )
  208.       {
  209.          i++;
  210.          j = read( fd, &buf[i], 1 );
  211.          tmp = buf[i];
  212.       }
  213.       else
  214.       {
  215.          j = read( fd, &tmp, 1 );
  216.       }
  217.       assert( j != -1 );
  218.       if ( j == 0 )
  219.       {
  220.          buf[i] =  0;
  221.          return -1;
  222.       }
  223.    }
  224.    if ( i < 1 )
  225.    {
  226.       buf[i] = 0;
  227.    }
  228.    else
  229.    {
  230.       if ( buf[i-1] == '\r' )
  231.       {
  232.          buf[i-1] = 0;
  233.       }
  234.       else
  235.       {
  236.          buf[i] = 0;
  237.       }
  238.    } 
  239.    return 0;
  240. }
  241.  
  242. /*****************************************************
  243. Disables the printing of the next prompt.
  244. useful for multipacket messages.
  245. ******************************************************/
  246. void Kill_Prompt( void )
  247. {
  248.      No_Prompt = TRUE;
  249. }
  250.  
  251. /*****************************************************
  252. Displays the Micq prompt.  Maybe someday this will be 
  253. configurable
  254. ******************************************************/
  255. void Prompt( void )
  256. {
  257. //#ifndef USE_MREADLINE
  258. #if 0
  259.    if ( !No_Prompt ) 
  260. #endif
  261.       R_doprompt ( SERVCOL PROMPT_STR NOCOL );
  262. #ifndef USE_MREADLINE
  263. //#error test
  264.       fflush( stdout );
  265. #endif
  266.    No_Prompt = FALSE;
  267. }
  268.  
  269. /*****************************************************
  270. Displays the Micq prompt.  Maybe someday this will be 
  271. configurable
  272. ******************************************************/
  273. void Soft_Prompt( void )
  274. {
  275. //#ifdef USE_MREADLINE
  276. #if 1
  277.    R_doprompt ( SERVCOL PROMPT_STR NOCOL );
  278.    No_Prompt = FALSE;
  279. #else
  280.    if ( !No_Prompt ) {
  281.       M_print( PROMPT_STR );
  282.       fflush( stdout );
  283.    } else {
  284.      No_Prompt = FALSE;
  285.    }
  286. #endif
  287. }
  288.  
  289. void Time_Stamp( void )
  290. {
  291.    struct tm *thetime;
  292.    time_t p;
  293.    
  294.    p=time(NULL);
  295.    thetime=localtime(&p);
  296.  
  297.    M_print( "%.02d:%.02d:%.02d",thetime->tm_hour,thetime->tm_min,thetime->tm_sec );
  298. }
  299.